Op deze pagina vind je een demonstratie van een statistische techniek aan de hand van een voorbeeld.

Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.

De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.


Referentie

Het voorbeeld op deze pagina is geïnspireerd door een studie van Mell et al. (2021). Om praktische en didactische redenen werden de hypothesen en de data aangepast.



1 Doel

Lineaire regressie is een statistische techniek die je kan gebruiken om een hypothese te toetsen over het effect van een variabele (een onafhankelijke variabele of predictor) op een andere variabele (de afhankelijke variabele of uitkomst). In lineaire regressie is die afhankelijke variabele altijd continu, dus ten minste van intervalniveau.

Zo goed als altijd zal je moeten controleren voor extra predictoren die het resultaat van de toetsing kunnen beĂŻnvloeden.

Op deze pagina kom je te weten hoe je zo’n hypothesetoetsing kan uitvoeren in het geval dat de predictor een categorische variabele is.



2 De dataset

De dataset dataVertrouwen bevat gegevens van 7 variabelen geobserveerd bij 1217 Belgen.

Deze dataset kan je inladen met read.csv(). De data kan je best meteen in een object dataVertrouwen onderbrengen zodat je die later makkelijk opnieuw kan oproepen.

dataVertrouwen <- read.csv("https://statlas.ugent.be/datasets/vertrouwen.csv")


Met str() krijg je een opsomming van alle variabelen in de dataset. Je vindt er ook telkens bij om welk datatype het gaat. Afhankelijk van het datatype zal je sommige functies wel of juist niet kunnen gebruiken om je data te verkennen. Het heeft bijvoorbeeld geen zin om een gemiddelde te berekenen van een variabele van type chr.

str(dataVertrouwen) 
'data.frame':   1217 obs. of  7 variables:
 $ X         : int  1 2 3 4 5 6 7 8 9 10 ...
 $ vertrouwen: num  2.85 -3.74 -1.74 -2.71 0.22 ...
 $ sesKind   : num  0.296 4.213 0.317 0.296 4.856 ...
 $ sesVolw   : num  -0.27 -2.33 2.48 2.48 1.09 ...
 $ geslacht  : chr  "Man" "Man" "Vrouw" "Vrouw" ...
 $ wrkls     : chr  "Ja" "Ja" "Nee" "Ja" ...
 $ burgst    : chr  "nooit getrouwd" "feitelijk gescheiden" "getrouwd" "getrouwd" ...

In de output van str() zie je inderdaad dat er 7 variabelen zijn met telkens 1217 observaties.



3 Een lineair model specifiëren in R

Je kan een model bouwen met de functie lm(). Het eerste argument van die functie is een formule waarin je specifieert welke variabelen je in het model wil opnemen:

  1. een afhankelijke variabele
  2. een tilde ~
  3. predictoren gescheiden door een +

In het tweede argument bepaal je uit welk dataframe de variabelen komen. Hier is dat dataVertrouwen.

Zo’n model kan je in een object met een eenvoudige naam stoppen.

mijnModel <- lm(vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht, data = dataVertrouwen)


Output van het model in R

Met de functie summary() kan je heel veel informatie over het model oproepen. Als argument geef je gewoon het object mijnModel.

summary(mijnModel)

Call:
lm(formula = vertrouwen ~ sesKind + sesVolw + burgst + wrkls + 
    geslacht, data = dataVertrouwen)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.7908 -1.5647 -0.0545  1.5608  6.9194 

Coefficients:
                           Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 0.40784    0.51988   0.784  0.43291    
sesKind                    -0.07147    0.03436  -2.080  0.03774 *  
sesVolw                     0.32933    0.03814   8.634  < 2e-16 ***
burgstgetrouwd             -0.44809    0.50093  -0.895  0.37123    
burgstnooit getrouwd       -0.55005    0.51172  -1.075  0.28263    
burgstsamenlevingscontract -1.41825    0.54923  -2.582  0.00993 ** 
burgstweduwe/weduwnaar      0.18910    0.55128   0.343  0.73164    
burgstwettelijk gescheiden -0.93027    0.54211  -1.716  0.08642 .  
wrklsNee                    0.16151    0.18257   0.885  0.37652    
geslachtVrouw              -0.04919    0.12493  -0.394  0.69386    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.147 on 1207 degrees of freedom
Multiple R-squared:  0.08093,   Adjusted R-squared:  0.07408 
F-statistic: 11.81 on 9 and 1207 DF,  p-value: < 2.2e-16

De regressiecoëfficiënten vind je in de kolom Estimate. Meer uitleg over de interpretatie van deze coëfficiënten vind je hier, voornamelijk onderaan p.228 en onder 10.2.4 en 10.2.5. Merk op dat R standaard dummy-codering toepast.



4 Assumpties

Hypothesetoetsing met lineaire regressie is enkel een bruikbare en betrouwbare techniek als aan een reeks voorwaarden is voldaan. Die moet je verifiëren vooraleer je met de interpretatie mag beginnen.

De Gauss-Markovassumpties en de normaliteitsassumptie van de fouten kan je nagaan met plot(). Dit commando geeft je vier plots na elkaar. De eerste drie zijn relevant. In dit geval lijkt alles in orde en mag je verdergaan met de analyse.

Meer uitleg over de assumpties en deze plots vind je hier (vanaf 9.9).

plot(mijnModel)


Een laatste aandachtspunt vooraleer je tot de hypothesetoetsing kan overgaan, is collineariteit. Dat is een situatie waarbij predictoren sterk gecorreleerd zijn. Met de functie vif() uit het R-package car kan je te weten komen of er in jouw model een probleem is met collineariteit. Als de variance inflation factor bij elke variabele in de buurt van 1 ligt, mag je verder met de analyse.

library(car)
vif(mijnModel)
             GVIF Df GVIF^(1/(2*Df))
sesKind  1.010140  1        1.005057
sesVolw  1.118624  1        1.057650
burgst   1.161549  5        1.015088
wrkls    1.057608  1        1.028401
geslacht 1.030211  1        1.014993

Meer uitleg over collineariteit vind je hier.



5 Hypothese over een categorische predictor

Stel: je vermoedt dat iemands familiale situatie een invloed heeft op het vertrouwen in anderen.

Om data te verzamelen over de familiale situatie vraag je mensen naar hun burgerlijke staat burgst. Dat is in dit geval de predictor.

De afhankelijke variabele is vertrouwen. Deze continue variabele is gebaseerd op een reeks vragen uit een enquĂȘte.


De hypothese die je wil toetsen is: er is op populatieniveau een effect van iemands familiale situatie op het vertrouwen in andere mensen.

Omdat je met een categorische predictor burgst te maken hebt, moet je deze hypothese toetsen aan de hand van een modelvergelijking met de functie anova(). Zo vergelijk je het model waarin burgst als predictor is opgenomen met een tweede model modelZonder waarin burgst niet is opgenomen, maar dat voor de rest wel identiek is.

Een uitgebreide uitleg over toetsing via modelvergelijking vind je hier, voornamelijk onder 4.4.2.

We controleren ook voor nog andere predictoren. Dat doen we omdat de conclusie over het bestaan van een effect van burgst op vertrouwen kan afhangen van de aanwezigheid van die extra predictoren in het model. De algemene regel is: neem elke predictor op waarvan je denkt dat die een invloed heeft op de afhankelijke variabele en/of dat die gerelateerd is aan de predictor die je onderzoekt (hier burgst).


Nulhypothese en alternatieve hypothese

De nulhypothese stelt dat beide modellen even goed fitten. Het model zonder de extra predictor burgst kan dan behouden blijven. De alternatieve hypothese houdt in dat het complexere model wel beter fit.


Significantieniveau

Net als bij elke hypothesetoets moet je een significantieniveau kiezen. Hier kiezen we voor de veelgebruikte waarde \(\alpha = 0.05\).


Modelvergelijking

Om te toetsen of burgst een effect heeft op vertrouwen voer je een modelvergelijking uit. Eerst specifieer je een tweede model modelZonder waarin burgst niet is opgenomen.

modelZonder <- lm(vertrouwen ~ sesKind + sesVolw + wrkls + geslacht, data = dataVertrouwen)


Nu kan je de functie anova() gebruiken. De output vertelt je of het model met burgst je in staat stelt om over het algemeen betere predicties te maken van vertrouwen dan het model zonder burgst.

anova(modelZonder, mijnModel) 
Analysis of Variance Table

Model 1: vertrouwen ~ sesKind + sesVolw + wrkls + geslacht
Model 2: vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht
  Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
1   1212 5686.5                                  
2   1207 5563.2  5    123.25 5.3483 7.192e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Conclusie

De F-toets om de modellen te vergelijken levert een p-waarde op van \(7.1922811\times 10^{-5}\). Dit is veel kleiner dan 0.05, dus je kan de nulhypothese verwerpen ten voordele van de alternatieve hypothese.



6 Visualiseren

Het package effects laat je toe om eenvoudig visualisaties te maken van effecten in lineaire regressiemodellen.


install.packages('effects') # eenmalig het package installeren

library(effects) # package laden voor gebruik

plot(effect('burgst', mijnModel), # let op de aanhalingstekens rond burgst
     axes=list(x=list(rotate=90))) # met dit argument draai je de namen van de niveaus van burgst



7 Referenties

Mell H., Safra L., Demange P., Algan Y., Baumard N. & Chevallier C. (2021). Early life adversity is associated with diminished social trust in adults. Political Psychology. doi: 10.1111/pops.12756